/* eslint-disable */
import { Base64 } from 'js-base64';
// import BMap from 'BMap'

// 本地数据
export const LOCALSTATE = Base64.decode('LOCALSTATE');

export const isBase64 = (str:string)=> {
  
  const notBase64 = /[^A-Z0-9+\/=]/i;
  const len = str.length;
  if (!len || len % 4 !== 0 || notBase64.test(str)) {
    return false;
  }
  const firstPaddingChar = str.indexOf('=');
  return firstPaddingChar === -1 ||
    firstPaddingChar === len - 1 ||
    (firstPaddingChar === len - 2 && str[len - 1] === '=');
}
export const storage = {
  get: (key,isDecrypt?) => {
    const localStr = localStorage.getItem(key);
    if(isDecrypt){
      if(localStr&&isBase64(localStr)){
        return JSON.parse(decrypt(localStr))
      }
      return key===LOCALSTATE?{}:'';
    }
    
    return localStorage.getItem(key) && JSON.parse(localStorage.getItem(key));
  },
  set: (key, data,isEncrypt?) => {
    if(isEncrypt){
      return localStorage.setItem(key, encrypt(JSON.stringify(data)));
    }
    return localStorage.setItem(key, JSON.stringify(data));
  },
  remove: (key) => {
    localStorage.removeItem(key);
  },
  add: (parentKey, key, data) => {
    localStorage.getItem(parentKey);
    const parentData = JSON.parse(localStorage.getItem(parentKey));
    if (parentData) {
      parentData.key = data;
    }
    localStorage.setItem(parentKey, JSON.stringify(data));
    localStorage.removeItem(key);
  },
  clear: () => {
    localStorage.clear();
  },
};

export const formatDataToAntd = (
  data: any[],
  label = 'name',
  value = 'id',
  children = 'children',
  labelInValue = false,
) => {
  return data.map((item) => {
    if (item[children]) {
      const c = formatDataToAntd(item[children], label, value, children, labelInValue);
      if (children !== 'children') {
        // eslint-disable-next-line no-param-reassign
        delete item[children];
      }
      return {
        ...item,
        label: item[label],
        value: labelInValue ? `${item[label]}-${item[value]}` : item[value],
        children: c,
      };
    }
    return {
      ...item,
      label: item[label],
      value: labelInValue ? `${item[label]}-${item[value]}` : item[value],
    };
  });
};

export type DataType = {
  label: string;
  value: string | number;
  children?: DataType;
  [propsName: string]: any;
};
export const getArrayByLevelAndId = (data: DataType[], value, level) => {
  let index = 0;
  const fun = (data) => {
    if (level === index) {
      return data;
    }
    // console.log(value[index], data, data.filter(item => value[index] === item.value))
    index += 1;
    const newData = data.filter((item) => value[index - 1] === item.value);
    return fun(newData[0] ? newData[0].children : []);
  };
  return fun(data);
};

export const regMap = {
  chinese: /^[\u4E00-\u9FA5\uF900-\uFA2D]+$/, // 中文汉字
  userName: /^[\u4E00-\u9FA5\uF900-\uFA2D·]+$/, // 姓名(需要支持少数名族中国带.的名字)
  userNameWithEn: /^[\u4E00-\u9FA5\uF900-\uFA2Da-zA-Z·]+$/, // 姓名(输入类型只支持汉字和英文“·”)
  engname: /^[a-zA-Z](?=.*?[,].*?)[a-zA-Z,]+$/, // 姓名拼音
  idCard: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
  accountBankName: /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/,
  bankName: /^[a-zA-Z0-9\u4e00-\u9fa5]+$/,
  accountNumber: /^\d{6,30}$/,
  account: /^\d{6,30}$/,
  phone: /^1(3|4|5|6|7|8|9)\d{9}$/,
  mobile: /^1(1|2|3|4|5|6|7|8|9)\d{9}$/,
  money: /^\d{1,9}$|^\d{1,9}(\.\d{1,2})?$/, // 金额通用类型【整数部分9位，小数部分2位】
  money14: /^\d{1,14}$|^\d{1,14}(\.\d{1,2})?$/, // 金额【整数部分14位，小数部分2位】
  money20: /^\d{1,17}(\.\d{1,2})?$|^\d{1,20}$/, // 金额【整数部分14位，小数部分2位】
  price: /^\d{1,9}$|^\d{1,9}(\.\d{1,2})?$/, // 金额【勿删除，非同一人开发，未统一使用regMap.money】
  carPrice: /^\d{1,9}$|^\d{1,9}(\.\d{1,2})?$/, // 金额【勿删除，非同一人开发，未统一使用regMap.money】
  financeCharge: /^\d{1,9}$|^\d{1,9}(\.\d{1,2})?$/, // 金额【勿删除，非同一人开发，未统一使用regMap.money】
  zipCode: /^[0-9]{6}$/, // 邮政编码通用类型
  all: /(.*)/, // 任意字符
  bankCardNo: /^[0-9]{16,19}$/, // 16~19位银行卡号【用于银行卡号校验】
  contactWay: /^[a-zA-Z0-9_-]+$/,
  creditReportId: /^[0-9a-zA-Z]{1,30}$/,
  remark: /<\/?[^>]*>/g,
  'yyyy-MM-dd HH:mm': /^\d{4,}-(?:0?\d|1[12])-(?:[012]?\d|3[01]) (?:[01]?\d|2[0-4]):(?:[0-5]?\d|60)$/,
  'yyyy-MM-dd': /(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)/,
  yyyyMMdd: /(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)/,
  number: /^[1-9]\d*|0$/,
  numberString: /^[0-9]{1,}$/, // 数字【字符串也可】
  numberAZaz: /^[0-9a-zA-Z]+$/, // 只输入数字与字母
  number2_2: /^[0-9]{1,2}(\.\d{1,2})?$/, // 数字整数2位小数两位
  number0: /^[0-9]{1,}$/, // 0开头或不是0开头的数字
  accountName: /^[a-zA-Z0-9\u4e00-\u9fa5]+$/, // 字母大小写，数字，汉字
  address: /^[a-zA-Z0-9-\u4e00-\u9fa5]+$/, // 字母大小写，数字，汉字，特殊字符-
  integerZero: /^([1-9]\d*|[0]{1,1})$/, // 0和正整数
  rangeInteger: /^[1-9]\d{0,2}$/, // 1-999数字
  letterAndCN: /^[a-zA-Z\u4e00-\u9fa5]+$/, // 汉字和字母
  percentage: /^(\d?\d(\.\d{0,2})?|100)$/, // 0到100的浮点数
  nonNegaDecimal: /^\d+(\.\d+)?$/,
  phoneLandline: /^\d{0,4}-?\d{0,8}-?\d{0,4}$/, // 手机和座机
  creditVal: /<\/?[^>]*>/g,
  numberX: /^[0-9X]+$/, // 数字+大写字母X
  slashChar: /^[a-zA-Z0-9/\u4e00-\u9fa5]+$/, // 数字、字母、正斜杠
  decimal: /^[0-9a-zA-Z]+$/, // 只输入数字与字母
  money8: /^\d{1,8}$|^\d{1,6}(\.\d{1,2})|^\d{1,7}(\.\d{1,1})?$/, // 限定位数8位（其中含2位小数和1为特殊符号“.”）
  money10: /^\d{1,10}$|^\d{1,8}(\.\d{1,2})|^\d{1,9}(\.\d{1,1})?$/, // 限定位数10位（其中含2位小数和1为特殊符号“.”）
  cardNumber: /^\d{12,20}$/, // 信息表还款卡
  areaCode: /^\d{3,4}$/, // 区号
  areaNumber: /^\d{7,8}$/, // 号码
  email: /\w@\w*\.\w/,

  money8_2: /^\d{1,8}$|^\d{1,8}(\.\d{1,2})?$/, // 金额类型：8位整数，可保留2位小数
  money8_4: /^\d{1,8}$|^\d{1,8}(\.\d{1,4})?$/, // 金额类型：8位整数，可保留4位小数
  money5_2: /^\d{1,5}$|^\d{1,5}(\.\d{1,2})?$/, // 金额类型：5位整数，可保留2位小数
  money4_2: /^\d{1,4}$|^\d{1,4}(\.\d{1,2})?$/, // 金额类型(面积)：4位整数，可保留2位小数
  money2_2: /^\d{1,2}$|^\d{1,2}(\.\d{1,2})?$/, // 金额类型：2位整数，可保留2位小数
  rateToFixed1: /^\d{1,2}$|^\d{1,2}(\.\d{1,1})?$/, // 利率，保留1位小数
  rateToFixed2: /^\d{1,2}$|^\d{1,2}(\.\d{1,2})?$/, // 利率，保留2位位小数
  rateToFixed3: /^\d{1,2}$|^\d{1,2}(\.\d{1,3})?$/, // 利率，保留3位小数
  rateToFixed4: /^\d{1,2}$|^\d{1,2}(\.\d{1,4})?$/, // 利率，保留4位小数
  rateToFixed8: /^\d{1,2}$|^\d{1,2}(\.\d{1,8})?$/, // 利率，保留8位小数
  area: /^\d{1,12}$|^\d{1,12}(\.\d{1,2})?$/, // 面积：单位㎡

  socialCreditCode: /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/, // 统一社会信用代码
  internet: /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/, // 网站地址
  chineseWidthParentheses: /^[\u4E00-\u9FA5\uF900-\uFA2D()]+$/, // 中文汉字带小括号
};

/**
 * 加密
 */
export const encrypt = (payload) => {
  return Base64.encode(payload);
};

/**
 * 解密
 */
export const decrypt = (payload) => {
  return Base64.decode(payload);
};

export const base64DecodeSearch = () => {
  const { search } = window.location;
  if (search) {
    const searchArr = search.split('?');
    return decrypt(searchArr[1]);
  }
  return search;
};

export const isEmpty = (data) => {
  return !(data !== null && data !== undefined && data !== '');
};

/**
 * @param {object} target 目标对象
 * @param {any} defaultValue 默认值
 * @param {string} exec 结尾属性字符
 * @example
 *   const city = getter(deepObj, '天津市').respData.data.useInfo.sellerAddress.city._;
 */
export function getter(target, defaultValue, exec = '_') {
  return new Proxy(
    {},
    {
      get: (o, n) => {
        const result = target || defaultValue;
        if (n === exec) {
          return result;
        }
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
        return getter(typeof target === 'undefined' ? result : target[n], defaultValue, exec);
      },
    },
  );
}

/**
 * 名称脱敏
 * @param string
 */
export const desensitationName = (string) => {
  /**
   * 不然客户经理名称脱敏处理
   * 脱敏规则：两个字的，脱第二个字，比如张*；三个字，保留第一个字和最后一个字，比如曹*萍；四个字及以上，保留前两个字和最后一个字，比如欧阳**野
   */
  if (string.length >= 4) {
    return string.slice(0, 2).padEnd(string.length - 1, '*') + string[string.length - 1];
  }
  if (string.length >= 3) {
    return string.slice(0, 1).padEnd(string.length - 1, '*') + string[string.length - 1];
  }
  if (string.length >= 2) {
    return string.slice(0, 1).padEnd(string.length, '*');
  }
  return string;
};

/**
 * 身份证脱敏
 * @param string
 */
export const desensitationIdcard = (string) => {
  if (!string) return string;
  return string.slice(0, 4).padEnd(string.length - 1, '*') + string.slice(-4);
};
export const upsetArray = (data:any[]) => {
  data = JSON.parse(JSON.stringify(data));
  for (let j, i = data.length; i; j = parseInt(`${Math.random() * i}`), --i, [data[i], data[j]] = [data[j], data[i]]);
  return data;
}

//百度地图获取定位信息
//关于状态码
//BMAP_STATUS_SUCCESS	检索成功。对应数值“0”。
//BMAP_STATUS_CITY_LIST	城市列表。对应数值“1”。
//BMAP_STATUS_UNKNOWN_LOCATION	位置结果未知。对应数值“2”。
//BMAP_STATUS_UNKNOWN_ROUTE	导航结果未知。对应数值“3”。
//BMAP_STATUS_INVALID_KEY	非法密钥。对应数值“4”。
//BMAP_STATUS_INVALID_REQUEST	非法请求。对应数值“5”。
//BMAP_STATUS_PERMISSION_DENIED	没有权限。对应数值“6”。(自 1.1 新增)
//BMAP_STATUS_SERVICE_UNAVAILABLE	服务不可用。对应数值“7”。(自 1.1 新增)
//BMAP_STATUS_TIMEOUT	超时。对应数值“8”。(自 1.1 新增)
const BMAP_STATUS = {
  BMAP_STATUS_SUCCESS: 0,
  BMAP_STATUS_CITY_LIST: 1,
  BMAP_STATUS_UNKNOWN_LOCATION: 2,
  BMAP_STATUS_UNKNOWN_ROUTE: 3,
  BMAP_STATUS_INVALID_KEY: 4,
  BMAP_STATUS_INVALID_REQUEST: 5,
  BMAP_STATUS_PERMISSION_DENIED: 6,
  BMAP_STATUS_SERVICE_UNAVAILABLE: 7,
  BMAP_STATUS_TIMEOUT: 8,
}
export const getLocationWithBMap = (callback: (result: false | any) => void) => {
  var geolocation = new BMap.Geolocation();
  geolocation.getCurrentPosition(function (r) {
    if (this.getStatus() == BMAP_STATUS.BMAP_STATUS_SUCCESS) {
      // alert('您的位置：' + r.point.lng + ',' + r.point.lat);
      var geocoder = new BMap.Geocoder({ extensions_town: true });
      geocoder.getLocation(new BMap.Point(r.point.lng, r.point.lat), function (result) {
        if (result) {
          console.log(result)
          callback(result)
        }
      });
    }
    else {
      // alert('failed' + this.getStatus());
      console.log(this, r)
      callback(false)
    }
  }, { enableHighAccuracy: true })
}
